﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ПрограммноеЗакрытие;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	НастройкиПользователя = Параметры.НастройкиПользователя;
	ВыборИзСписка = Параметры.ВыборИзСписка;
	ПолноеОписание = Параметры.ПолноеОписание;
	РежимВыбора = Параметры.РежимВыбора;
	
	ЗаполнитьСписокСертификатов(НастройкиПользователя, Параметры.МассивВыбора);
	УправлениеФормой(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	СервисКриптографииDSSСлужебныйКлиент.ПриОткрытииФормы(ЭтотОбъект, ПрограммноеЗакрытие);
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если СервисКриптографииDSSСлужебныйКлиент.ПередЗакрытиемФормы(
			ЭтотОбъект,
			Отказ,
			ПрограммноеЗакрытие,
			ЗавершениеРаботы) Тогда
		ЗакрытьФорму();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаСертификатов

&НаКлиенте
Процедура ТаблицаСертификатовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если ВыборИзСписка Тогда
		ВыборСтрокиСертификата();
	Иначе
		ПросмотрСведенийСертификата();
	КонецЕсли;	
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура СвойстваСертификата(Команда)
	
	ПросмотрСведенийСертификата();
	
КонецПроцедуры

&НаКлиенте
Процедура Выбрать(Команда)
	
	ВыборСтрокиСертификата();
	
КонецПроцедуры

&НаКлиенте
Процедура Удалить(Команда)
	
	ТекущаяСтрока = Элементы.ТаблицаСертификатов.ТекущиеДанные;
	
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если НЕ ЭтоСертификаты(РежимВыбора) Тогда
		ПараметрыЦикла = Новый Структура;
		ПараметрыЦикла.Вставить("Идентификатор", ТекущаяСтрока.Идентификатор);
		ПараметрыЦикла.Вставить("ТекущийСертификат", ТекущаяСтрока);
		ОписаниеСледующее = Новый ОписаниеОповещения("УдалениеЗапросаНаСертификатПослеВопроса", ЭтотОбъект, ПараметрыЦикла);
		
		СписокКоманд = Новый СписокЗначений;
		СписокКоманд.Добавить("Да", НСтр("ru = 'Да'"));
		СписокКоманд.Добавить("Нет", НСтр("ru = 'Нет'"));
		
		СервисКриптографииDSSКлиент.ВывестиВопрос(ОписаниеСледующее,
			НСтр("ru = 'Удалить выбранный запрос на сертификат?'"),
			СписокКоманд,
			,
			НСтр("ru = 'Удаление запроса'"));
			
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыборПродолжения(Команда)
	
	ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию();
	ПараметрыЗакрытия.Вставить("Результат", Истина);
	ЗакрытьФорму(ПараметрыЗакрытия);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ЗакрытьФорму(ПараметрыЗакрытия = Неопределено)
	
	ПрограммноеЗакрытие = Истина;
	
	Если ПараметрыЗакрытия = Неопределено Тогда
		ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию(Ложь, "ОтказПользователя");
	КонецЕсли;	
	
	Закрыть(ПараметрыЗакрытия);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыборСтрокиСертификата()

	ТекущаяСтрока		= Элементы.ТаблицаСертификатов.ТекущиеДанные;
	Если ТекущаяСтрока <> Неопределено Тогда
		ПараметрыЗакрытия = СервисКриптографииDSSКлиент.ОтветСервисаПоУмолчанию();
		Если ЭтоСертификаты(РежимВыбора) Тогда
			ВыборПользователя = Новый Структура("Отпечаток", ТекущаяСтрока.Отпечаток);
			Если ПолноеОписание Тогда
				ВыборПользователя = ПолучитьПолноеОписаниеСертификата(ВыборПользователя);
				Если НЕ ВыборПользователя.Выполнено Тогда
					ПараметрыЗакрытия = ВыборПользователя;
				КонецЕсли;
			КонецЕсли;
		Иначе
			ВыборПользователя = ТекущаяСтрока.Идентификатор; 
		КонецЕсли;	
		ПараметрыЗакрытия.Вставить("Результат", ВыборПользователя);
		ЗакрытьФорму(ПараметрыЗакрытия);
	КонецЕсли;	
	
КонецПроцедуры

&НаКлиенте
Процедура ПросмотрСведенийСертификата()
	
	ТекущаяСтрока = Элементы.ТаблицаСертификатов.ТекущиеДанные;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ЭтоСертификаты(РежимВыбора) Тогда
		ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь);
		ПараметрыОперации.ИдентификаторОперации = УникальныйИдентификатор;
		ПараметрыОперации.Вставить("ФормаВладелец", ЭтотОбъект);
		
		СервисКриптографииDSSКлиент.ПоказатьСертификат(
			Неопределено, 
			НастройкиПользователя,
			Новый Структура("Отпечаток", ТекущаяСтрока.Отпечаток),
			ПараметрыОперации);
			
	Иначе
		ПараметрыОперации = СервисКриптографииDSSСлужебныйКлиент.ПодготовитьПараметрыОперации(Ложь);
		ПараметрыОперации.ИдентификаторОперации = УникальныйИдентификатор;
		ПараметрыОперации.Вставить("ФормаВладелец", ЭтотОбъект);
		
		СервисКриптографииDSSКлиент.ПоказатьЗапросНаСертификат(
			Неопределено, 
			НастройкиПользователя,
			ТекущаяСтрока.Идентификатор,
			ПараметрыОперации);
				
	КонецЕсли;		
		
КонецПроцедуры

// Параметры:
//   РезультатВыполнения	- Структура
//  ПараметрыЦикла 		- Структура:
//    * Идентификатор	- Число
//
&НаКлиенте
Процедура УдалениеЗапросаНаСертификатПослеВопроса(РезультатВыполнения, ПараметрыЦикла) Экспорт
	
	Если РезультатВыполнения.Выполнено И РезультатВыполнения.Результат = "Да" Тогда
		ОписаниеСледующее = Новый ОписаниеОповещения("УдалениеЗапросаНаСертификатПослеВыполнения", ЭтотОбъект, ПараметрыЦикла);
		СервисКриптографииDSSКлиент.УдалитьЗапросНаСертификат(ОписаниеСледующее, НастройкиПользователя, ПараметрыЦикла.Идентификатор); 
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалениеЗапросаНаСертификатПослеВыполнения(РезультатВыполнения, ПараметрыЦикла) Экспорт
	
	Если РезультатВыполнения.Выполнено И РезультатВыполнения.Результат Тогда
		ТаблицаСертификатов.Удалить(ПараметрыЦикла.ТекущийСертификат);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоСертификаты(РежимВыбора)
	
	Результат = РежимВыбора = "Сертификаты";
	Возврат Результат;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УправлениеФормой(КонтекстФормы)
	
	ЭлементыФормы = КонтекстФормы.Элементы;
	
	ЭлементыФормы.Выбрать.Видимость = КонтекстФормы.ВыборИзСписка;
	
	Если ЭтоСертификаты(КонтекстФормы.РежимВыбора) Тогда
		ЭлементыФормы.УдалитьЗапрос.Видимость = Ложь;
		ЭлементыФормы.ТаблицаСертификатовПродолжить.Видимость = Ложь;
		ЭлементыФормы.УдалитьЗапрос.Видимость = Ложь;
	Иначе
		ЭлементыФормы.ТаблицаСертификатовСрокДействия.Видимость = Ложь;
		ЭлементыФормы.ТаблицаСертификатовИздатель.Заголовок = НСтр("ru = 'Владелец'");
		КонтекстФормы.Заголовок = НСтр("ru = 'Запросы на сертификат'");
	КонецЕсли;
	
КонецПроцедуры	

// Параметры:
//   ТекущиеНастройки	- см. СервисКриптографииDSS.НастройкиПользователяПоУмолчанию
//   МассивВыбора		- Массив из Структура:
//     * Идентификатор	- Число
//     * Имя			- Строка
//     * Издатель		- Строка
//
&НаСервере
Процедура ЗаполнитьСписокСертификатов(ТекущиеНастройки, МассивВыбора = Неопределено)
	
	Если МассивВыбора = Неопределено Тогда
		ТекущийМассив = Новый Массив;
	Иначе
		ТекущийМассив = МассивВыбора;
	КонецЕсли;
	
	ТаблицаСертификатов.Очистить();
	
	Если ЭтоСертификаты(РежимВыбора) Тогда
		ВесьСписок = ТекущиеНастройки.Сертификаты;
		
		Для каждого СтрокаКлюча Из ВесьСписок Цикл
			Сертификат = СтрокаКлюча.Значение;
			НоваяСтрока = ТаблицаСертификатов.Добавить();
			НоваяСтрока.Отпечаток		= Сертификат.Отпечаток;
			НоваяСтрока.Идентификатор 	= Сертификат.Идентификатор;
			НоваяСтрока.ОбщееИмя 		= Сертификат.Представление;
			НоваяСтрока.Основной 		= Сертификат.Основной;
			НоваяСтрока.Издатель		= Сертификат.Издатель;
			НоваяСтрока.ДатаОкончания	= Сертификат.ДатаОкончания;
			НоваяСтрока.СрокДействия	= Формат(Сертификат.ДатаНачала, "ДЛФ=DT") + " - " + Формат(Сертификат.ДатаОкончания, "ДЛФ=DT");
			НоваяСтрока.ТребуетПинКод	= Сертификат.ТребуетсяПинКод;
		КонецЦикла;
		
		ТаблицаСертификатов.Сортировать("ДатаОкончания Убыв");
		
	Иначе
		Для каждого СтрокаКлюча Из ТекущийМассив Цикл
			НоваяСтрока = ТаблицаСертификатов.Добавить();
			НоваяСтрока.Идентификатор 	= СтрокаКлюча.Идентификатор;
			НоваяСтрока.ОбщееИмя 		= СтрокаКлюча.Имя;
			НоваяСтрока.Издатель		= СтрокаКлюча.Владелец;
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры	

&НаСервереБезКонтекста
Функция ПолучитьПолноеОписаниеСертификата(Отпечаток)
	
	Возврат СервисКриптографииDSS.НайтиСертификат(Отпечаток);
	
КонецФункции

#КонецОбласти